import winreg


def query_reg_key(key_path, search_value=None, recursive=True):
    try:
        parts = key_path.split("\\")
        root_key_name = parts[0]
        sub_key_path = "\\".join(parts[1:])

        root_keys = {
            "HKEY_CURRENT_USER": winreg.HKEY_CURRENT_USER,
            "HKEY_LOCAL_MACHINE": winreg.HKEY_LOCAL_MACHINE,
        }
        root_key = root_keys.get(root_key_name)
        if not root_key:
            raise ValueError(f"无效的根键: {root_key_name}")

        def _recursive_query(key_obj, current_path):
            # 查询当前键的值
            try:
                i = 0
                while True:
                    name, value, value_type = winreg.EnumValue(key_obj, i)
                    value_str = str(value)
                    if not search_value or search_value.lower() in value_str.lower():
                        value_type_name = {
                            winreg.REG_SZ: "REG_SZ",
                            winreg.REG_DWORD: "REG_DWORD",
                            winreg.REG_BINARY: "REG_BINARY",
                            # 可扩展其他类型...
                        }.get(value_type, str(value_type))
                        print(f"{current_path}\\{name} [{value_type_name}] = {value_str}")
                    i += 1
            except WindowsError:
                pass  # 枚举完成

            # 递归查询子键
            if recursive:
                try:
                    i = 0
                    while True:
                        subkey_name = winreg.EnumKey(key_obj, i)
                        subkey_path = f"{current_path}\\{subkey_name}"
                        try:
                            subkey = winreg.OpenKey(key_obj, subkey_name)
                            _recursive_query(subkey, subkey_path)
                            winreg.CloseKey(subkey)
                        except Exception as e:
                            print(f"无法访问 {subkey_path}: {e}")
                        i += 1
                except WindowsError:
                    pass  # 枚举完成

        key = winreg.OpenKey(root_key, sub_key_path)
        _recursive_query(key, key_path)
        winreg.CloseKey(key)
    except Exception as e:
        print(f"错误: {e}")

def delete_reg_key(key_path, value_name=None):
    """
    失败原因：
    权限不足：删除操作需要适当的访问权限。
    键值被占用：某些注册表项在系统运行时被锁定。
    路径大小写敏感：注册表路径在某些情况下区分大小写。
    注意：
    管理员权限：确保以管理员身份运行脚本，尤其是删除 HKEY_LOCAL_MACHINE 下的键值。
    备份注册表：操作前先导出相关注册表项，以防误删。
    :param key_path:
    :param value_name:
    :return:
    """
    try:
        parts = key_path.split("\\")
        root_key_name = parts[0]
        sub_key_path = "\\".join(parts[1:])

        root_keys = {
            "HKEY_CURRENT_USER": winreg.HKEY_CURRENT_USER,
            "HKEY_LOCAL_MACHINE": winreg.HKEY_LOCAL_MACHINE,
            "HKEY_CLASSES_ROOT": winreg.HKEY_CLASSES_ROOT,
            "HKEY_USERS": winreg.HKEY_USERS,
            "HKEY_CURRENT_CONFIG": winreg.HKEY_CURRENT_CONFIG,
        }
        root_key = root_keys.get(root_key_name)
        if not root_key:
            raise ValueError(f"无效的根键: {root_key_name}")

        if value_name:  # 删除值
            key = winreg.OpenKey(root_key, sub_key_path, 0, winreg.KEY_SET_VALUE)
            winreg.DeleteValue(key, value_name)
            winreg.CloseKey(key)
            print(f"成功删除值: {key_path}\\{value_name}")
        else:  # 删除整个键
            winreg.DeleteKey(root_key, sub_key_path)
            print(f"成功删除键: {key_path}")
    except Exception as e:
        print(f"错误: {e}")


import winreg


def create_reg_key(key_path, value_name, value_data, value_type=winreg.REG_SZ):
    try:
        # 分割路径为父路径和子键名
        parts = key_path.split("\\")
        root_key_name = parts[0]
        sub_key_path = "\\".join(parts[1:])

        # 获取根键对象
        root_keys = {
            "HKEY_CURRENT_USER": winreg.HKEY_CURRENT_USER,
            "HKEY_LOCAL_MACHINE": winreg.HKEY_LOCAL_MACHINE,
            # 可扩展其他根键...
        }
        root_key = root_keys.get(root_key_name)
        if not root_key:
            raise ValueError(f"无效的根键: {root_key_name}")

        # 创建/打开子键
        key = winreg.CreateKey(root_key, sub_key_path)

        # 设置值
        winreg.SetValueEx(key, value_name, 0, value_type, value_data)

        # 关闭键
        winreg.CloseKey(key)
        print(f"成功创建: {key_path}\\{value_name}")
    except Exception as e:
        print(f"错误: {e}")



if __name__ == '__main__':
    # 示例：递归查询所有子键和值
    # query_reg_key(r"HKEY_CURRENT_USER\Software\Microsoft")

    # 示例：递归查找包含"Chrome"的项
    # query_reg_key(r"HKEY_CURRENT_USER\Software", "Chrome")
    # query_reg_key(r"HKEY_CURRENT_USER\Software", r"C:\Users\Administrator\AppData\Roaming")
    query_reg_key(r"HKEY_CURRENT_USER\Software", "PyCharm")
    # 示例：删除值
    # delete_reg_key(r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\TypedPaths\url6", "Version")
    delete_reg_key(r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\TypedPaths\url6")
    query_reg_key(r"HKEY_CURRENT_USER\Software", "PyCharm")
    # 示例：创建字符串值
    # create_reg_key(r"HKEY_CURRENT_USER\Software\MyApp", "Version", "1.0")
    # create_reg_key(r"HKEY_CURRENT_USER\Software\MyApp", "Enabled", 1, winreg.REG_DWORD)
    #
    # # 示例：删除值
    # delete_reg_key(r"HKEY_CURRENT_USER\Software\MyApp", "Version")
    # delete_reg_key(r"HKEY_CURRENT_USER\Software\MyApp")
    # query_reg_key(r"HKEY_CURRENT_USER\Software\MyApp")